home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / demo / mag / Infamia3.lha / infamia03 / mv_code / copper / skip4.s < prev   
Text File  |  1996-07-24  |  7KB  |  263 lines

  1.         ************************************
  2.         *       /\/\                       *
  3.         *      /    \                      *
  4.         *     / /\/\ \ O R B_I D           *
  5.         *    / /    \ \   / /              *
  6.         *   / /    __\ \ / /               *
  7.         *   ¯¯     \ \¯¯/ / I S I O N S    *
  8.         *           \ \/ /                 *
  9.         *            \  /                  *
  10.         *             \/                   *
  11.         *     Feel the DEATH inside!       *
  12.         ************************************
  13.         * Coded by:                        *
  14.         * The Dark Coder / Morbid Visions  *
  15.         ************************************
  16.  
  17. ; commenti alla fine del sorgente
  18.  
  19.     SECTION    DK,code
  20.  
  21.     incdir    "Infamia:MV_code/"
  22.     include    MVstartup.s        ; Codice di startup: prende il
  23.                     ; controllo del sistema e chiama
  24.                     ; la routine START: ponendo
  25.                     ; A5=$DFF000
  26.  
  27.         ;5432109876543210
  28. DMASET    EQU    %1000001010000000    ; copper,bitplane,blitter DMA
  29.  
  30.  
  31. START:
  32.  
  33.     move    #DMASET,dmacon(a5)
  34.     move.l    #COPPERLIST,cop1lc(a5)
  35.     move    d0,copjmp1(a5)
  36.  
  37.     move.l    #copperloop,cop2lc(a5)    ; carica l'indirizzo del loop
  38.                     ; in COP2LC
  39.  
  40. mouse:
  41.  
  42.     bsr    CambiaCopper
  43.  
  44.     moveq    #3-1,d7
  45. WaitFrame
  46. ; notare il doppio controllo sulla sincronia
  47. ; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
  48.     move.l    #$1ff00,d1    ; bit per la selezione tramite AND
  49.     move.l    #$13000,d2    ; linea da aspettare = $130, ossia 304
  50. .Waity1
  51.     move.l    vposr(a5),d0    ; vposr e vhposr
  52.     and.l    d1,d0        ; seleziona solo i bit della pos. verticale
  53.     cmp.l    d2,d0        ; aspetta la linea $130 (304)
  54.     bne.s    .waity1
  55.  
  56. .Waity2
  57.     move.l    vposr(a5),d0
  58.     and.l    d1,d0
  59.     cmp.l    d2,d0
  60.     beq.s    .waity2
  61.  
  62.     dbra    d7,WaitFrame
  63.  
  64.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  65.     bne.s    mouse            ; se no, torna a mouse:
  66.  
  67.     rts
  68.  
  69. ****************************************************
  70. * Questa routine muove la bandiera e cambia i colori
  71.  
  72. CambiaCopper:
  73.  
  74.     move.b    PosBandiera(pc),d0
  75.  
  76.     tst.b    PosFlag
  77.     beq.s    Basso
  78.  
  79.     subq.b    #1,d0
  80.     cmp.b    #$81,d0
  81.     bra.s    Muovi        ; le istruzioni Bcc non alterano i CC
  82.  
  83. Basso    addq.b    #1,d0
  84.     cmp.b    #$bf,d0
  85.  
  86. Muovi
  87.     shs    PosFlag        ; testa limiti (entrambi! ;)
  88.     move.b    d0,PosBandiera
  89.     lsl    #8,d0
  90.     move.b    #$07,d0
  91.     move    d0,Inizio
  92.     add    #$4000,d0
  93.     move    d0,Fine
  94.  
  95.     tst.b    FadeFlag
  96.     beq.s    FadeIn
  97.  
  98. FadeOut
  99.     sub    #$010,verde+2    ; aumenta luminosita`
  100.     cmp    #$080,verde+2
  101.     sne    FadeFlag    ; se siamo al minimo passa a FadeIn
  102.  
  103.     sub    #$0100,rosso+2    ; aumenta luminosita`
  104.     rts
  105.  
  106. FadeIn
  107.     add    #$010,verde+2    ; aumenta luminosita`
  108.     cmp    #$0f0,verde+2    ; se siamo al massimo passa a FadeOut
  109.     seq    FadeFlag
  110.  
  111.     add    #$100,rosso+2    ; aumenta luminosita`
  112.  
  113.     rts
  114.  
  115. * Posizione prima riga della bandiera
  116. ; La bandiera deve rimanere tra le righe $80 e $ff, quindi essendo alta
  117. ; $40, la posizione deve variare tra le righe $80 e $bf
  118. PosBandiera    dc.b    $a0
  119. PosFlag        dc.b    0
  120. FadeFlag    dc.b    0
  121.  
  122.     SECTION    MY_COPPER,CODE_C
  123.  
  124. *************************************************************************
  125. * Copper Macros by The Dark Coder / Morbid Visions
  126. * vers. 3 SE / 16-07-96 / per ASM One 1.29
  127. * questa e` una versione ridotta delle copper macros usate dai Morbid Visions
  128. * realizzata appositamente per i sorgenti pubblicati su Infamia.
  129. * La versione completa (integrata con le altre macros standard MV) ha
  130. * controlli aggiuntivi sugli errori e permette di utilizzare il Blitter
  131. * Finished Disable bit. Chi e` interessato puo` contattare The Dark Coder.
  132.  
  133. * formato
  134. * CMOVE valore immediato, registro hardware destinazione
  135. * WAIT  Hpos,Vpos[,Hena,Vena]
  136. * SKIP  Hpos,Vpos[,Hena,Vena]
  137. * CSTOP
  138.  
  139. * Nota: Hpos,Vpos coordinate copper, Hena, Vena sono i valori di maschera
  140. * della posizione copper, opzionali (se non specificati viene assunto
  141. * Hena=$fe e Vena=$7f)
  142.  
  143. cmove:    macro
  144.     dc.w     [\2&$1fe]
  145.     dc.w    \1
  146.     endm
  147.  
  148. wait:    macro
  149.     dc.w    [\2<<8]+[\1&$fe]+1
  150.     ifeq    narg-2
  151.         dc.w    $fffe
  152.     endc    
  153.     ifeq    narg-4
  154.         dc.w    $8000+[[\4&$7f]<<8]+[\3&$fe]
  155.     endc
  156.     endm
  157.  
  158. skip:    macro
  159.     dc.w    [\2<<8]+[\1&$fe]+1
  160.     ifeq    narg-2
  161.         dc.w    $fffe
  162.     endc    
  163.     ifeq    narg-4
  164.         dc.w    $8000+[[\4&$7f]<<8]+[\3&$fe]+1
  165.     endc
  166.     endm
  167.  
  168.  
  169. cstop:    macro
  170.     dc.w    $ffff
  171.     dc.w    $fffe
  172.     endm
  173.  
  174.  
  175. * inizia la copperlist
  176. COPPERLIST:
  177.  
  178. ; barra 1
  179.     cmove    $111,color00
  180.     wait    $7,$29
  181.     cmove    $a0a,color00
  182.     wait    $7,$2a
  183.     cmove    $11f,color00
  184.     wait    $7,$2b
  185.     cmove    $000,color00
  186.  
  187. Inizio:
  188.     wait    $7,$80
  189.  
  190. copperloop:            ; da qui inizia il loop
  191.  
  192. verde:    cmove    $080,color00    ; colore verde. Il valore RGB da caricare nel
  193.                 ; registro si trova all'indirizzo "verde+2"
  194.                 ; perche` e` la seconda word dell'istruzione
  195.                 ; copper
  196.  
  197.     wait    $1e-4,$80,$3e,0    ; aspetta primo parte
  198.                 ; le y sono mascherate completamente
  199.                 ; sono mascherati i 2 bit piu` significativi
  200.                 ; delle x. In questo modo il loop viene
  201.                 ; ripetuto 4 volte ogni riga.
  202.  
  203. rosso:    cmove    $0800,color00        ; rosso. Modificare a "rosso+2"
  204.     wait    $3e-20,$80,$3e,0    ; seconda cambio colore
  205.  
  206.  
  207. Fine:
  208.     skip    $0,$c0,$0,$7f    ; SKIP alla linea $c0
  209.                 ; (le x sono mascherate)
  210.  
  211.     cmove    0,copjmp2    ; scrive in COPJMP2 - salta ad inizio loop
  212.  
  213.     cmove    $000,color00
  214.     wait    220,255
  215.  
  216. ; barra 2
  217.     wait    $7,$14
  218.     cmove    $11f,color00
  219.     wait    $7,$15
  220.     cmove    $a0a,color00
  221.     wait    $7,$16
  222.     cmove    $111,color00
  223.  
  224.     cstop            ; Fine della copperlist
  225.  
  226.     end
  227.  
  228. Questo esempio mostra un copper loop che si ripete piu` volte durante una
  229. stessa riga, grazie all'uso di WAIT con mascherate (PARZIALMENTE) anche
  230. le coordinate X.
  231. Si tratta di una variazione dell'esempio skip3.s, nel quale abbiamo
  232. una "bandiera" formata da 2 colori che si ripetono orizzontalmente.
  233. Il corpo del loop e` costituito da 2 sole CMOVE, una per ogni diverso
  234. colore utilizzato. Mascherando i due bit piu` significativi della posizione
  235. orizzontale delle WAIT si fa si che il ciclo viene ripetuto 4 volte per ogni
  236. riga, analogamente a quanto abbiamo visto per le posizioni verticali.
  237. Per avere un loop che si ripete 2 volte per ogni riga basta mascherare
  238. solamente il bit piu` significativo delle posizioni orizzontali delle WAIT.
  239. Notate che e` molto difficile ottenere loop che si ripetono un numero di volte
  240. maggiore di 4, perche` le WAIT dovrebbero attendere posizioni orizzontali
  241. talmente vicine tra di loro che il copper non fa in tempo ad eseguire nemmeno
  242. un istruzione.
  243.  
  244. Notate che per avere delle bande di colore avente la stessa dimensione
  245. si devono aggiustare opportunamente le posizioni orizzontali di attesa delle
  246. WAIT, per compensare il fatto che quando il copper "esce" dall'attesa
  247. nella prima WAIT del loop esegue subito la CMOVE $xx,COLOR00 seguente, mentre
  248. quando "esce" dall'attesa nella seconda WAIT deve eseguire la SKIP e la
  249. CMOVE $0,COPJMP2 prima di tornare ad eseguire la CMOVE $yy,COLOR00 all'inizio
  250. del loop. 
  251.  
  252. Notate che questo tipo di utilizzo del copper e` simile a quello che si fa
  253. per generare i plasmi. Nel caso dei plasmi non si usano le WAIT e le CMOVE
  254. vengono eseguite di continuo. Nel caso dei plasmi, ogni cambio di colore
  255. corrisponde ad una diversa CMOVE. In questo caso invece, molti cambi di colore
  256. vengono eseguiti mediante un unica CMOVE. Lo svantaggio e` che naturalmente
  257. le "bande" generate dalla stessa CMOVE non possono avere colori diversi,
  258. ma c'e` il vantaggio complementare che per modificarne il colore basta una sola
  259. scrittura in memoria. Nel caso di questo esempio, ad ogni frame vengono
  260. modificate 2 sole istruzioni copper. Se non usassimo le WAIT con posizioni
  261. orizzontali mascherate dovremmo usare 8 CMOVE per cabiare tutti i colori in
  262. una riga e di conseguenza dovremmo modificarle tutte e 8 ad ogni frame.
  263.